//
//  DHUserAccountViewModel.swift
//  Weibo
//
//  Created by Holfioo on 15/9/4.
//  Copyright © 2015年 Holfioo. All rights reserved.
//

import UIKit
import ReactiveCocoa

class DHUserAccountViewModel: NSObject {
    // 单例方法
    static let sharedUserAccount = DHUserAccountViewModel()
    
    override init() {
        
        // 解档数据
        userAccount = DHUserAccount.loadUserAccount()
    }
    
    // token 不等于空。代表已经登录
    var userLogin: Bool {
        return access_token != nil
    }
    
    var userAccount: DHUserAccount?
    // 定义token
    var access_token: String? {
        // 作为私有成员变量userAccount的参数
        return userAccount?.access_token
    }
    // 返回模型的url地址。方便控制器用sd 进行加载。
    var iconUrl: NSURL? {
        return NSURL(string: userAccount?.avatar_large ?? "")
    }
    
    func loadUserAccount(code: String) -> RACSignal {
        return RACSignal.createSignal({ (subscriber) -> RACDisposable! in
            // 使用方法 doNext 相当于一个管道。
            DHRequestTool.shareTool.getOAuthToken(code).doNext({ (result) -> Void in
                // printLog(token)
                // 讲获得的token字典 转为模型
                let account = DHUserAccount(dict: result as! [String : AnyObject])
                self.userAccount = account
                //                printLog(account)
                // 执行方法
                DHRequestTool.shareTool.showUsers(account.uid!).subscribeNext({ (result) -> Void in
                    // 打印放回的结果
                    let dict = result as! [String: AnyObject]
                    // 增加到字典中。
                    account.name = dict["name"] as! String?
                    account.avatar_large = dict["avatar_large"] as! String?
                    
                    // 取出数据以后进行保存。
                    account.saveUserAccount()
                    subscriber.sendCompleted()
                    printLog(account)
                    }, error: { (error) -> Void in
                        subscriber.sendError(error)
                    })
                // 注意要发送 错误。否则程序无法正常运行。
            }).subscribeError({ (error) -> Void in
                subscriber.sendError(error)
                })
            return nil
        })
    }
}